package app.controllers;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

import app.models.Especialidade;
import app.models.Funcionario;
import app.models.enums.EstadosBrasileiros;
import app.models.enums.StatusUsuario;
import app.models.enums.TipoPerfil;
import app.services.EspecialidadeService;
import app.services.FuncionarioService;
import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Post;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.Validator;
import br.com.caelum.vraptor.validator.ValidationMessage;

@Resource
public class FuncionarioController extends Controller {

	private final Result result;
	private final FuncionarioService service;
	private final EspecialidadeService especialidadeService;
	private final HttpServletRequest request;
	
	private final StatusUsuario STATUS_ATIVO = StatusUsuario.ATIVO;
	private final StatusUsuario STATUS_INATIVO = StatusUsuario.INATIVO;
	
	private final Validator validator;

	public FuncionarioController(Result result, FuncionarioService service, 
			EspecialidadeService especialidadeService,
			HttpServletRequest request, Validator validator) {
		
		this.result = result;
		this.service = service;
		this.especialidadeService = especialidadeService;
		this.request = request;
		this.validator = validator;
	}
	
	@Get("/funcionarios")
	public void index() {
		this.result.include("ultimosFuncionarios", service.findLastRegistered());
		this.result.include("funcionarios", service.findAllOrdered());
	}
	
	@Get("/funcionarios/find")
	public void index(String filter) {
		this.result.include("filter", filter);
		this.result.include("funcionarios", service.findByFilter(filter));
		
		this.result.of(this).table();
	}
	
	@Get("/funcionarios/new")
	public void form() {
		this.result.include("estadosBrasileiros", EstadosBrasileiros.values());
		
		List<TipoPerfil> perfilList = new ArrayList<TipoPerfil>();
		perfilList.add(TipoPerfil.ESPECIALISTA);
		perfilList.add(TipoPerfil.SECRETARIA);
		
		this.result.include("perfis", perfilList);
		
		List<Especialidade> especialidadeList = especialidadeService.findAll();
		
		if (especialidadeList.isEmpty()) {
			validator.add(new ValidationMessage("Necessário " +
					"<a title=\"Clique aqui para Cadastrar Especialidade\" " +
					"href=\"" + handleMe(request) + "/especialidades/new\">Cadastrar Especialidade</a> " +
					"antes de Cadastrar Funcionário", "erro"));
		}

		validator.onErrorUsePageOf(this).index();		
		this.result.include("especialidades", especialidadeList);
	}
	
	@Post("/funcionarios/save")
	public void save(Funcionario funcionario) {
//		for(Funcionario f : service.findAll()){
//			if( (f.getUsuario().getCpf().equals(funcionario.getUsuario().getCpf()) 
//					|| f.getUsuario().getRg().equals(funcionario.getUsuario().getRg())) && f.getId() != funcionario.getId() ){
//				
//				validator.add(new ValidationMessage("Funcionario já cadastrado", "erro"));
//			}
//		}
		
		this.result.include("funcionario", funcionario);
		
		if (null != request.getParameter("submit")) {
			if (request.getParameter("submit").equals("Confirmar")) {
				validator.validate(funcionario);
				validator.validate(funcionario.getUsuario());
				validator.validate(funcionario.getUsuario().getEndereco());
				validator.validate(funcionario.getEspecialidade());
				
				validator.onErrorRedirectTo(this).form();
				
				service.create(funcionario);
				
				result.forwardTo(this).index();
			}
		} else {
			this.result.forwardTo(this).form();
		}
		
	}
	
	@Get("/funcionarios/{id}/edit")
	public void edit(Long id) {
		this.result.include("estadosBrasileiros", EstadosBrasileiros.values());
		
		List<TipoPerfil> perfilList = new ArrayList<TipoPerfil>();
		perfilList.add(TipoPerfil.ESPECIALISTA);
		perfilList.add(TipoPerfil.SECRETARIA);
		
		this.result.include("perfis", perfilList);
		this.result.include("especialidades", especialidadeService.findAll());
		this.result.include("funcionario", service.find(id));
	}
	
	@Post("/funcionarios/update")
	public void update(Funcionario funcionario) {
//		for(Funcionario f : service.findAll()){
//			if( (f.getUsuario().getCpf().equals(funcionario.getUsuario().getCpf()) 
//					|| f.getUsuario().getRg().equals(funcionario.getUsuario().getRg())) && f.getId() != funcionario.getId() ){
//				
//				validator.add(new ValidationMessage("Funcionario já cadastrado", "erro"));
//			}
//		}
		
		validator.validate(funcionario);
		validator.validate(funcionario.getUsuario());
		validator.validate(funcionario.getUsuario().getEndereco());
		
		validator.onErrorRedirectTo(this).edit(funcionario.getId());
		
		service.update(funcionario);
		
		result.redirectTo(this).index();
	}
	
	@Get("/funcionarios/{id}/updateStatus")
	public void update(Long id) {
		Funcionario funcionario = new Funcionario();
		funcionario = service.find(id);
		
		if (STATUS_ATIVO.equals(funcionario.getUsuario().getStatus())){
			funcionario.getUsuario().setStatus(STATUS_INATIVO);
		} else {
			funcionario.getUsuario().setStatus(STATUS_ATIVO);
		}
		
		this.service.update(funcionario);
		this.result.forwardTo(this).index();
	}
	
	@Get("/funcionarios/{id}/show")
	public void show(Long id) {
		this.result.include("funcionario", service.find(id));
	}
	
	// Metódo para redirecionar para table.jsp
	public void table() { }
	
}